home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / comm / misc / zvm1_25.lha / includet.zvm < prev    next >
Text File  |  1993-09-27  |  12KB  |  435 lines

  1. /*^^^^^^^^^^^^^^^^^^^^^^^^^^END OF USER CODE^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  2. /*-------------------------------HANDS OFF--------------------------------*/
  3. /* DON'T TOUCH THIS STUFF.  IF YOU FIX SOMETHING HERE, TELL ME ABOUT IT   */
  4. /* 
  5.     HISTORY
  6.  
  7.     V1.32    - Added getoption, readoptions, setserial
  8.     V1.31    - Fixed debugger stuff (no value)
  9.     V1.30    - Added debugger stuff
  10.     V1.29    - Fixed type. and log. problem not being exposed
  11.         - Fixed filetype function
  12.     V1.28    - Fixed a problem in callup.  Maybe related to 5.02 roms
  13.     V1.27    - Added filetype rexx function to determine the type
  14.         of a file
  15.     V1.26   - Added some more rexx functions to interface with ZVM
  16.         - Added the callup function to dial a telephone number
  17.     V1.25     - Fixed getnumvoicemessages
  18.     V1.24    - Added requiremode, assumemode, etc.
  19.     V1.23    - Changed the way type and status are handled and added
  20.         a new argument to the get and set stuff (namely, the log number)
  21.         - Also changed to setLogEntryVariable and getLogEntryVariable
  22.         instead of the numerous functions we had before
  23.     V1.22 - Added stuff to make it more programmable
  24. */
  25.  
  26. exit
  27.  
  28. getOption: procedure expose options.
  29.     parse upper arg optionName
  30.     return options.optionName
  31.  
  32. readOptions: procedure expose options.
  33.     firstLine = sourceline(1)
  34.     parse var firstLine '/*' title '.'
  35.     optionsFileName = title || '.options'
  36.     if exists(optionsFileName) then do
  37.         call open('options', optionsFileName, 'r')
  38.         do while ~eof('options')
  39.             line = readln('options')
  40.             parse upper var line variable '=' value
  41.             options.variable = value
  42.         end
  43.         call close('options')
  44.     end
  45.  
  46.     return
  47.  
  48. /* this function dials a number and returns status.normal
  49.     if someone picks up the phone that was called.  It returns
  50.     other types of errors otherwise.
  51. */
  52.  
  53. callup: procedure expose status. mode. device.
  54.     parse arg telephoneNumber
  55.     
  56.     /* should do an at+fclass=8 */
  57.     status = requireMode(mode.voiceMode)
  58.     if status ~= status.normal then return status
  59.  
  60.     status = writeLine('ATD' telephoneNumber)
  61.     if status ~= status.normal then return status
  62.  
  63.     /* this should swallow the thing we just sent out */
  64.     status = readLine(60) /* 60 second timeout */
  65.     if status ~= status.normal then return status
  66.  
  67. ringing:
  68.     status = readLine(60) /* 60 second timeout */
  69.     if status ~= status.normal then return status
  70.  
  71.     /* line should have the line we want */
  72.     if line = 'VCON' then do
  73.         /* removed the next line because even though we received
  74.             a VCON, it doesn't go into voicemode */
  75.         call requireDevice(device.telephoneLine)
  76.         /*
  77.         call assumeMode(mode.connectedMode)
  78.         */
  79.         return status.normal
  80.     end
  81.  
  82.     if line = 'RINGING' then signal ringing
  83.     if line = 'NO CARRIER' then return status.busydetected
  84.     if line = '' then signal ringing
  85.     if line = 'NO DIALTONE' then do
  86.         call showDebugger("I couldn't detect the dialtone")
  87.         return status.busydetected
  88.     end
  89.  
  90.     return status.busyDetected
  91.  
  92. /* This function gives you a simple way of presenting an N key menu
  93.     to the caller
  94.  
  95.     ARGS:  numKeys choiceFileName badChoiceFileName timeOut validChoices
  96.     numBadChoices
  97.  
  98.     numKeys = number of keys wanted
  99.     choiceFileName = file name of the menu
  100.     badChoiceFileName = what to say if caller enters a bad choice
  101.     timeOut = number of seconds allowed before timing out
  102.     validChoices = list of characters that are valid choices
  103.     numBadChoices = number of times you want to present the menu before exiting
  104.  
  105.     RETURNS:  status, choice = valid key
  106. */
  107.  
  108. presentMenu: procedure expose choice status. mode.
  109.     parse arg numKeys,choiceFileName,badChoiceFileName,timeOut,validChoices,numBadChoices .
  110.  
  111.     timesAround = numBadChoices;
  112.  
  113.     do timesAround = numBadChoices to 1 by -1
  114.         status = playVoice(choiceFileName)
  115.  
  116.         if status > status.keyDetected then signal presentMenuDone;
  117.  
  118.         status = readNKeys(numKeys, timeOut)
  119.  
  120.         if status = status.timedOut then do
  121.             call flushPhoneBuffer()
  122.             status = playVoice('voice:voices/Timed Out')
  123.             iterate
  124.         end
  125.         if status ~= status.normal then signal presentMenuDone;
  126.  
  127.         choice = keys
  128.         if pos(choice, validChoices) = 0 then do
  129.             call flushPhoneBuffer()
  130.             status = playVoice(badChoiceFileName)
  131.             iterate
  132.         end
  133.  
  134.         return status.normal
  135.     end
  136.  
  137.     status = status.timedOut
  138. presentMenuDone:
  139.     return status
  140.  
  141. /*----------------------------------------------------------------------*/
  142. /*    Here are the encapsulated functions.  They're responsible for
  143.     communicating with ZVM.  Don't edit or touch them, except for
  144.     bug fixes.
  145. */
  146.  
  147. playVoice:  procedure expose status. mode.
  148.     parse arg fileName
  149.     address voicemail1 'playVoice' fileName
  150.     if rc >= status.busyDetected then
  151.         call showDebugger('playVoice' rc)
  152.     return rc
  153.  
  154. /* this returns a handle to the newly created log entry */
  155. addLogEntry: procedure expose status. mode.
  156.     if arg() ~= 1 then do
  157.         say 'Bad arguments to addLogEntry'
  158.         return 20
  159.     end
  160.     parse arg logNumber
  161.     address voicemail1 'addLogEntry' logNumber
  162.     return result
  163.  
  164. setLogEntryVariable: procedure expose status. mode.
  165.     if arg() ~= 4 then do
  166.         say 'Bad arguments to setLogEntryVariable'
  167.         return 20
  168.     end
  169.     parse arg variable, logNumber, logEntryNumber, logEntryValue
  170.     address voicemail1 'setLogEntryVar' variable ',' || logNumber || ',' || logEntryNumber || ',' || logEntryValue
  171.     return rc
  172.  
  173. getLogEntryVariable: procedure expose status. mode.
  174.     if arg() ~= 3 then do
  175.         say 'Bad arguments to getLogEntryVariable'
  176.         return 'BADBADBAD'
  177.     end
  178.     parse arg variable, logNumber, logEntryNumber
  179.     address voicemail1 'getLogEntryVar' variable ',' || logNumber || ',' || logEntryNumber
  180.     return result
  181.  
  182. getNumVoiceMessages: procedure expose status. mode.
  183.     if arg() ~= 1 then do
  184.         say 'Bad arguments to getNumVoiceMessages'
  185.         return 'BADBADBAD'
  186.     end
  187.     parse arg logNumber
  188.     address voicemail1 'getNumVoiceMessages' logNumber
  189.     return result
  190.  
  191. recordVoice:  procedure expose status. mode.
  192.     parse arg fileName
  193.     address voicemail1 'recordVoice' fileName
  194.     return rc
  195.  
  196. password: procedure expose status. mode.
  197.     address voicemail1 'password'
  198.     return result
  199.  
  200. hasFax: procedure expose status. mode.
  201.     address voicemail1 'hasfax'
  202.     return result
  203.  
  204. playBeep:  procedure expose status. mode.
  205.     parse arg tone1, tone2, duration
  206.     address voicemail1 'playBeep' tone1 ',' tone2 ',' duration
  207.     return rc
  208.  
  209. readNKeys:  procedure expose status. keys mode.
  210.     parse arg numKeys, timeOut
  211.     address voicemail1 'readNKeys' numKeys ',' timeOut
  212.     if rc = status.normal then keys = result
  213.     return rc
  214.  
  215. read1Key:  procedure expose status. key mode.
  216.     parse arg timeOut
  217.     address voicemail1 'read1Key' timeOut
  218.     if rc = status.normal then key = result
  219.     return rc
  220.  
  221. readKeysUntil: procedure expose status. keys mode.
  222.     parse arg terminatingCharacter, maxCharacters, timeOut
  223.     address voicemail1 'readKeysUntil' terminatingCharacter ',' maxCharacters ',' timeOut
  224.     if rc = status.normal then keys = result
  225.     return rc
  226.  
  227. readLine: procedure expose status. line mode.
  228.     parse arg timeOut
  229.     address voicemail1 'readLine' timeOut
  230.     if rc = status.normal then line = result
  231.     return rc
  232.  
  233. quickATCommand: procedure expose status. mode.
  234.     parse arg command, timeout, errorLine
  235.     if arg(2, 'o') then timeout = 5
  236.     if arg(3, 'o') then errorLine = 'ERROR'
  237.  
  238.     rc = writeLine(command)
  239.     if rc ~= status.normal then return rc
  240.     rc = readLine(timeout)
  241.     if rc ~= status.normal then return rc
  242.     rc = readLine(timeout)
  243.     if line = errorLine then return status.error
  244.     return rc
  245.  
  246. writeLine: procedure expose status. mode.
  247.     parse arg line
  248.     address voicemail1 'writeLine' line
  249.     return rc
  250.  
  251. /* the 'assumeUnknownMode' is to make sure that any use of a voice command WILL
  252.     cause ZVM to hang up the line, reset the modem, then do its stuff */
  253.  
  254. dropLine: procedure expose status. mode.
  255.     address voicemail1 'requireMode' mode.commandMode
  256.     address voicemail1 'assumeUnknownMode'
  257.     return rc
  258.  
  259. atCommands: procedure expose status. mode.
  260.     address voicemail1 'requireMode' mode.connectedMode
  261.     address voicemail1 'assumeUnknownMode'
  262.     return rc
  263.  
  264. requireDevice: procedure expose status. mode.
  265.     parse arg device
  266.     address voicemail1 'requireDevice' device
  267.     return rc
  268.  
  269. requireCompression: procedure expose status. compression.
  270.     parse arg compression
  271.     address voicemail1 'requireCompression' compression
  272.     return rc
  273.  
  274. requireMode: procedure expose status. mode.
  275.     parse arg mode
  276.     address voicemail1 'requireMode' mode
  277.     return rc
  278.  
  279. assumeMode: procedure expose status. mode.
  280.     parse arg mode
  281.     address voicemail1 'assumeMode' mode
  282.     return rc
  283.  
  284. assumeUnknownMode: procedure expose status. mode.
  285.     address voicemail1 'assumeUnknownMode'
  286.     return rc
  287.  
  288. distinctiveRing: procedure expose status. mode.
  289.     address voicemail1 'distinctiveRing'
  290.     return result
  291.  
  292. currentCIDName: procedure expose status. mode.
  293.     address voicemail1 'currentCIDName'
  294.     return result
  295.  
  296. currentCIDNumber: procedure expose status. mode.
  297.     address voicemail1 'currentCIDNumber'
  298.     return result
  299.  
  300. fileType: procedure expose status. mode.
  301.     parse arg filename
  302.     address voicemail1 'filetype' filename
  303.     return result
  304.  
  305. /* handshaking = 1 if you want 7 wire handshaking, handshaking = 2 if you
  306.     want xon/xoff handshaking */
  307. changeSerialParameters: procedure expose status. mode.
  308.     parse arg bps, bits, stop, handshaking
  309.     address voicemail1 'setserial' bps ',' bits ',' stop ',' handshaking
  310.     return rc
  311.  
  312. /* this is mainly for fax mode */
  313. use19200: procedure expose status. mode.
  314.     call changeSerialParameters(19200, 8, 1, 1)
  315.     address voicemail1 'assumeUnknownMode'
  316.     return rc
  317.  
  318. flushPhoneBuffer:  procedure expose status. mode.
  319.     address voicemail1 'flushPhoneBuffer'
  320.     return status.normal
  321.  
  322. listen: procedure expose status. mode.
  323.     address voicemail1 'listen'
  324.     return status.normal
  325.  
  326. answerFax: procedure expose status. mode.
  327.     address rexx 'handleFax'
  328.     return rc
  329.  
  330. cTime: procedure expose status. now mode.
  331.     address voicemail1 'ctime'
  332.     return result
  333.  
  334. displayError: procedure expose status. mode.
  335.     parse arg error
  336.     address voicemail1 'displayError' error
  337.     return status.normal
  338.  
  339. displayStatus: procedure expose status. mode.
  340.     parse arg status
  341.     address voicemail1 'displayStatus' status
  342.     return status.normal
  343.  
  344. displayMessage: procedure expose status. mode.
  345.     parse arg message
  346.     address voicemail1 'displayMessage' message
  347.     return status.normal
  348.  
  349. /* Effectively unlistens also! */
  350. setLastError: procedure expose status. mode.
  351.     parse arg status, error
  352.     address voicemail1 'setLastError' status ',' error
  353.     return status.normal
  354.  
  355. showDebugger: procedure
  356.     parse arg debuggerInfo
  357.     
  358.     firstLine = sourceline(1)
  359.     parse var firstLine '/*' title '*/'
  360.     if showlist('p', 'DEBUGGERLOGGER1') then
  361.         address debuggerLogger1 'e' title ':' debuggerInfo
  362.     else
  363.         say title ':' debuggerInfo
  364.     return
  365.  
  366. /*-----------------------------------------------------------------------*/
  367. /*                         signal processing                             */
  368. error:
  369.     call showDebugger("Error" rc "at line" sigl)
  370.     exit 20
  371.  
  372. break_c:
  373. halt:
  374.     call showDebugger("Halt/Break_C at line" sigl)
  375.     exit 20
  376.  
  377.  
  378. novalue:
  379.     call showDebugger("No value at line" sigl)
  380.     exit 20
  381.  
  382. syntax:
  383.     call showDebugger("Syntax error" rc "at line" sigl)
  384.     exit 20
  385.  
  386.  
  387. /* Initialize everything needed to communicate correctly with ZVM */
  388. doInitializations: procedure expose compression. mode. status. device. type. log.
  389.  
  390. log.incomingLog = 0
  391. log.archiveLog = 1
  392. log.outgoingLog = 2
  393. log.outgoingArchiveLog = 3
  394.  
  395. /* compressions */
  396. compression.ADPCM2 = 2
  397. compression.ADPCM3 = 3
  398. compression.CELP = 1
  399.  
  400. /* devices */
  401. device.telephoneLine = 2
  402. device.externalMic = 8
  403. device.internalSpeaker = 16
  404.  
  405. /* file types */
  406. type.unknownFile = 0
  407. type.zvmRawFile = 1
  408. type.zyxelFile = 2
  409. type.iffFaxFile = 3
  410. type.iff8svxFile = 4
  411.  
  412. /* modem modes */
  413. mode.unknownMode = -1
  414. mode.commandMode = 0
  415. mode.voiceMode = 1
  416. mode.connectedMode = 2
  417. mode.playMode = 3
  418. mode.recordMode = 4
  419.  
  420. /* return statuses from the various commands */
  421. status.normal = 0
  422. status.keyDetected = 1
  423. status.quietDetected = 2
  424. status.silenceDetected = 3
  425. status.faxDetected = 4
  426. status.busyDetected = 5
  427. status.timedOut = 6
  428. status.signalDetected = 7
  429. status.overflow = 8
  430. status.error = 9
  431.  
  432. call addlib("rexxsupport.library", 0, -30, 0)
  433.  
  434. return
  435.